package is.olsenolsen;

//import is.hi.olsenolsen.Fastar;

import java.util.Random;
import java.util.Stack;

public class OlsenOlsenModel 
{
	//
	private Stack<Integer>   spilaStokkur;
	private Stack<Integer>   spilaBunka1;
	private Stack<Integer>   spilaBunka2;
	/**
	 * @category "Klasasmi�ur":
	 * 
	 * @tilgangur Klasasmi�urinn er h�r n�ttur til �ess a� upphafsstilla,
	 *            sem � �essu tilfelli er f�lgin � �v� a� undirb�a jar�veginn
	 *            undir nau�synlegum spilastokkum e�a spilabunkum eftir ��rfum.
	 *            
	 *            ��rfin fyrir spilabunka, er h�r �r�r talsins, samkv�mt
	 *            eftirfarandi upptalningu:
	 *            
	 *                         1. b�r til hl��u (stafla) fyrir
	 *                            spilastokk fyrir 52 e�a 55 spilum, sem
	 *                            er heill spilastokkur, spilin m� vera
	 *                            f�rri e�a fleiri, en �� ekki f�rri en 1,
	 *                            �v� a� �� gerist ekkert, enn enginn slys ��.
	 *                            
	 *                         2. b�r til a�ra hl��u fyrir
	 *                            spilabunka fyrir 52 e�a 55 spilum e�a
	 *                            fleiri e�a f�rri eftir �v� vi� hva�a
	 *                            spilaleikur er �tt vi�. Spilin m� helst
	 *                            ekki vera f�rri en 1, sem fyrr segir.
	 *                            
	 *                         3. b�r til �ri�ja hl��u fyrir
	 *                            spilabunka fyrir 52 e�a 55 spilum e�a
	 *                            fleiri e�a f�rri eftir �v� vi� hva�a
	 *                            spilaleikur er �tt vi�. Spilin m� helst
	 *                            ekki vera f�rri en 1, sem fyrr segir.
	 */
	//
	public OlsenOlsenModel()
	{
		// T�mur smi�ur
	}
	//
	public static boolean finnaMerkiSpils(Integer spilid,
			                              Integer fraSpili,
			                              Integer tilSpils)
	{
		boolean meta = false;
		//
		if ((spilid >= fraSpili) && (spilid <= tilSpils))
		{
			meta = true; 
		}
		else
		{
			meta = false;
		}
		return meta;
	} // finnaMerkiSpils( . . . ).
	//
	public void spilaStokkurTilbuinn(int[] spilin, int hvadaStokk)
	{
		int fjoldiSpila = 0;
		int i           = 0;
		fjoldiSpila = spilin.length;
		if (hvadaStokk == Fastar.ADAL_SPILASTOKKUR){
			for (i = 0; i < fjoldiSpila; i++)
			{
				this.spilaStokkur.push(spilin[i]);
			} // for
		} // if
		else if (hvadaStokk == Fastar.FYRSTI_SPILABUNKI)
		{
			for (i = 0; i < fjoldiSpila; i++)
			{
				this.spilaBunka1.push(spilin[i]);
			} // for
		} // else if
		else if (hvadaStokk == Fastar.ANNAR_SPILABUNKI)
		{
			for (i = 0; i < fjoldiSpila; i++)
			{
				this.spilaBunka2.push(spilin[i]);
			} // for
		} // else if
		else { // �rautarlending, ef ekkert anna� � vi�:
			for (i = 0; i < fjoldiSpila; i++)
			{
				this.spilaStokkur.push(spilin[i]);
			} // for
		} // else, sem sj�lfvali�, ef anna� � ekki vi�
	} // public void spilaStokkurTilbuinn.
	//
	/**
	 * @category A�fer�: Fall (method: function)
	 * @tilgangur S�kja �kve�i� spil �r spilastokki, ef �a� er til.
	 * 
	 * @forskilyr�i Spilastokkur.
	 * @eftirskilyr�i Eitt �kve�i� spil �r spilastokkinum, ef �a� er til
	 * @�rautarlending Ef spili� er ekki til, ver�ur �rkoman = -1, sem
	 *                 au�veldlega er h�gt a� skynja, sem villubo� me�
	 *                 vi�eigandi a�fer�um.
	 * 
	 * @notkun OlsenOlsenModel  = olsenModel;
	 *         this.akvedidSpil = olsenModel.saekjaAkvedidSpil
	 *                                       (Fastar.ADAL_SPILASTOKKUR,
	 *                                        this.einhverHeiltala     ); 
	 */
	public Integer saekjaAkvedidSpil (int Stokkur, int spilNumer){
		/*
		 *  Form�li um a�fer� vi� vinnslu stafla (hl��u)
		 * 
		 *  Hafa b�khald yfir spilum me� hj�lp stafla (hl��u):
		 *  Fyrst var nota� "push" s��an ver�ur nota�ur "get"
		 *  til �ess a� n� spilunum �r vi�eigandi hl��u, eftir
		 *  �v�, hvernig og hvar notandinn er staddur � spila-
		 *  leiknum. Spilin er safn heilt�lug�lda � beinni r��,
		 *  sem er skilgreint sem FIFO: First Inn First Out.
		 *  Breyturnar "i" eru teljarar til �ess a� halda utan
		 *  um sta�setningu bendils � st�flunum.
		 *  
		 *  Til fr��leiks: Ef nota�ur er "pop" � sta� "get" f�st
		 *  r��in af st�kunum � st�flunum, sem LIFO: Last Inn
		 *  First Out, en s� ni�urr��un var ekki n�gu hagst�� �
		 *  �essu d�mi, �ess vegna var notast vi� FIFO me� �v�
		 *  a� nota "get" � sta�inn fyrir "pop".
		 */
		Integer eittSpil = -1;
		//
		try
		{
			if (Stokkur == Fastar.ADAL_SPILASTOKKUR)
			{
				eittSpil = this.spilaStokkur.get(spilNumer);
			} // if Stokkur == Fastar.ADAL_SPILASTOKKUR)
			else if (Stokkur == Fastar.FYRSTI_SPILABUNKI)
			{
				eittSpil = this.spilaBunka1.get(spilNumer);
			} // if Stokkur == Fastar.ADAL_SPILASTOKKUR)
			else if (Stokkur == Fastar.ANNAR_SPILABUNKI)
			{
				eittSpil = this.spilaBunka2.get(spilNumer);
			} // if Stokkur == Fastar.ADAL_SPILASTOKKUR)
			else 
			{ // �rautarlending, ef ekkert anna� � vi�:
				eittSpil = this.spilaStokkur.get(spilNumer);
			} // else, sem sj�lfvali�, ef anna� � ekki vi�
		} // try
		catch (Exception ex){ // Annars nau�lending sem -1:
			eittSpil = -1;
		} // try catch: catch sem nau�lending, ef a� fari�
		//              fari� var �t fyrir umfang spilabunkans.
		return eittSpil;
	} // public Integer saekjaAkvedidSpil (int Stokkur, int spilNumer).
	//
	/**
	 * @category Stef
	 * @tilgangur B�ta inn eitt spil inn � stokka�an spilabunka � upphafi
	 *            leiks me� tilliti til �ess a� leikurinn s�
	 *            "Langa vitleysa", sem d�mi � �essu tilfelli.
	 */
	public void stingaInnAkvSpil(int[] Stokkur, int spilNumer){
		try
		{
			this.spilaStokkur.add(spilNumer, Stokkur[spilNumer]);
		}
		catch (Exception ex){ // Annars nau�lending:
			/*
			 * Sm� tilraun til �ess a� stinga spilinu fremst � bunka
			 * e�a � t�man b�nka.
			 */
			try
			{
				this.spilaStokkur.add(0, Stokkur[0]);
			}
			catch (Exception exceptAUKA){ // Algj�r �rautarlending:
				// Sennilega ekki h�gt a� gera meira � bili.
			} // catch �rautarlending.
		} // try catch: catch sem nau�lending.
	} // public void stingaInnAkvSpil.
	//
	/*
	 * Forskilyr�i:   Talnasvi� � formi l�g og h�markstala.
	 * 
	 * Eftirskilyr�i: Einhver slemmit�lu � bilinu fr�
	 *                l�gmarkinu = "lagMark" til
	 *                h�marksins = "haMark".
	 *                
	 *                Vi�fangsbreyturnar: lagMark og
	 *                haMark eru heilt�lur.
	 */
	public static int einhverTala(int lagMark, int haMark)
	{
		int talaFengin = 0;
		Random slemmbiNumer;
		slemmbiNumer = new Random();
		//
		talaFengin = slemmbiNumer.nextInt(haMark+1);
		//
		/*
		 * Forskilyr�i: Einhver h�markstala upp a� h�marki, sem
		 *              g�ti veri� til d�mis "J�ker" = 55 e�a
		 *              "K�nungur" = 52.
		 *             
		 * Eftirskilyr�i: Einhver slemmbitala innan �ess svi�s,
		 *                sem afmarkast af h�mark og l�markst�lu,
		 *                sem g�ti sta�i� fyrir vi�eigandi spil.
		 */
		while (talaFengin < lagMark)
		{
			/*
			 * Fastayr�ing: talan er undir l�gmarkinu, sem er
			 * "�sinn" � spilunum,sem d�mi og eftirfarandi a�ger�
			 * er til �ess �tla� a� breg�ast vi� �v� me� �v�
			 * a� f� aftur n�ja t�lu, sem er yfir e�a jafnt og
			 * l�gmarkinu, sem � �essu tilfelli er "�sinn" = 1. 
			 */
			talaFengin = slemmbiNumer.nextInt(haMark+1);
		} // while
		//
		return talaFengin;
	} // einhverTala
	//
} // public class OlsenOlsenModel.
